package com.atguigu.spzx.order.service.impl;

import com.atguigu.spzx.cart.client.ServiceCartClient;
import com.atguigu.spzx.model.entity.cart.CartItem;
import com.atguigu.spzx.model.entity.order.OrderItem;
import com.atguigu.spzx.model.entity.product.ProductSku;
import com.atguigu.spzx.model.vo.api.order.ApiOrderTradeVO;
import com.atguigu.spzx.model.vo.common.Result;
import com.atguigu.spzx.order.service.OrderService;
import com.atguigu.spzx.product.client.ServiceProductClient;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class OrderServiceImpl implements OrderService {
    @Resource
    ServiceCartClient serviceCartClient;
    @Resource
    ServiceProductClient serviceProductClient;
    @Override
    public ApiOrderTradeVO trade() {
        //order服务远程访问cart服务的接口时，没有携带请求头token，导致cart服务无法知道是哪个用户查询自己购物车中的购物项
        Result<List<CartItem>> result = serviceCartClient.allCheckedCart();
        Assert.isTrue(result.getCode().intValue()==200 , "远程查询选中购物项失败");
        //1、获取选中的购物项列表
        List<CartItem> itemList = result.getData();
        //2、将购物项列表1:1的转为订单项列表
        List<OrderItem> orderItems = itemList.stream().map(cartItem -> {
            OrderItem orderItem = new OrderItem();
            orderItem.setSkuId(cartItem.getSkuId());
            orderItem.setSkuName(cartItem.getSkuName());
            orderItem.setThumbImg(cartItem.getImgUrl());
            //添加商品到购物车以后，管理员可能会修改商品价格
            //现在直接使用购物项的价格，等到提交订单时，再去验价(学完kafka以后，使用kafka实现价格同步)
            orderItem.setSkuPrice(cartItem.getCartPrice());
            orderItem.setSkuNum(cartItem.getSkuNum());
            return orderItem;
        }).collect(Collectors.toList());
        //3、计算订单总金额: 每个购物项价格*购物项数量 累加
        //计算 每个购物项的小计金额  最后再累加
        BigDecimal totalAmount = orderItems.stream()
                //得到 购物项列表   每个购物项小计金额的集合
                .map(orderItem ->
                        new BigDecimal(orderItem.getSkuNum().toString()).multiply(orderItem.getSkuPrice()))
                //对上面的小计金额的集合 从第一个开始往后累加 得到总金额
                .reduce((a, b) -> a.add(b))
                //获取前面计算后的最终结果
                .get();
        //4、组装数据
        ApiOrderTradeVO orderTradeVO = new ApiOrderTradeVO();
        orderTradeVO.setOrderItemList(orderItems);
        orderTradeVO.setTotalAmount(totalAmount);
        return orderTradeVO;
    }

    @Override
    public ApiOrderTradeVO buy(Long skuId) {
        //立即购买和购物车业务无关
        //1、根据skuId查询productSku信息
        Result<ProductSku> result = serviceProductClient.getSkuBySkuId(skuId);
        Assert.isTrue(result.getCode().intValue()==200 , result.getMessage());

        ProductSku productSku = result.getData();
        //2、组装数据
        OrderItem orderItem = new OrderItem();
        orderItem.setSkuId(skuId);
        orderItem.setSkuName(productSku.getSkuName());
        orderItem.setThumbImg(productSku.getThumbImg());
        //添加商品到购物车以后，管理员可能会修改商品价格
        //现在直接使用购物项的价格，等到提交订单时，再去验价(学完kafka以后，使用kafka实现价格同步)
        orderItem.setSkuPrice(productSku.getSalePrice());
        orderItem.setSkuNum(1);
        ApiOrderTradeVO orderTradeVO = new ApiOrderTradeVO();
        orderTradeVO.setOrderItemList(Arrays.asList(orderItem));
        orderTradeVO.setTotalAmount(orderItem.getSkuPrice());
        return orderTradeVO;
    }
}
